package com.tsd.service;


import com.tsd.core.utils.HlpUtils;
import com.tsd.core.vo.HlpException;
import com.tsd.system.entity.SysUser;
import com.tsd.utils.AutoInjectUtils;

import java.lang.reflect.Method;
import java.util.*;

/**
 * @author Hillpool
 */
public class BaseServiceImpl {

    public static final long LOCK_EXPIRED_TIME_MS = 10000L;
    /**
     * 空数组的字符串
     */
    protected Object emptyArrayStr = "[]";

    /**
     * 检查某个值是否为空（字符串包括null以及"",其他则为null)，如果为空，则提示tip
     *
     * @param value
     * @param tip
     * @throws HlpException
     */
    public void checkEmpty(Object value, String tip) throws HlpException {
        if (HlpUtils.isEmpty(value)) {
            throw new HlpException(tip);
        }
    }

    /**
     * 检查某个list是否为空，如果为空，则提示tip
     *
     * @param list
     * @param tip
     * @throws HlpException
     */
    public void checkEmptyList(List<?> list, String tip) throws HlpException {
        if (HlpUtils.isEmptyList(list)) {
            throw new HlpException(tip);
        }
    }

    /**
     * 检查整数是否为0或者空
     *
     * @param value
     * @param tip
     * @throws HlpException
     */
    public void checkEqZero(Integer value, String tip) throws HlpException {
        if (value == null || value == 0) {
            throw new HlpException(tip);
        }
    }

    /**
     * 检查一个字符串值是否在一个字符串数组中，用于值的合法性判断
     *
     * @param tip
     * @param val
     * @param list
     * @return
     * @throws HlpException
     */
    public boolean checkStringIn(String tip, String val, String... list) throws HlpException {
        boolean in = false;
        for (String c : list) {
            if (val.equals(c)) {
                in = true;
                break;
            }
        }
        if (!in) {
            throw new HlpException(tip);
        }
        return in;
    }

    /**
     * 检查某个值是否不为空（字符串不为null以及不是"",其他则不是null)，如果不为null，则提示
     *
     * @param value
     * @param tip
     * @throws HlpException
     */
    public void checkNotEmpty(Object value, String tip) throws HlpException {
        if (!HlpUtils.isEmpty(value)) {
            throw new HlpException(tip);
        }
    }

    public String getPrimaryKey() {
        return HlpUtils.getUUIDWithout_();
    }

    public String getUuid() {
        return HlpUtils.getUUIDWithout_();
    }

    public final String TYPE_CREATE = AutoInjectUtils.TYPE_CREATE;
    public final String TYPE_UPDATE = AutoInjectUtils.TYPE_UPDATE;
    public final String TYPE_DELETE = AutoInjectUtils.TYPE_DELETE;
    public final String TYPE_AUDIT = AutoInjectUtils.TYPE_AUDIT;
    public final String TYPE_UPDATE_STOCK = AutoInjectUtils.TYPE_UPDATE_STOCK;

    /**
     * 自动注入数据
     *
     * @param object 对象
     * @param opUser 登录用户
     * @param type   操作数据类型：TYPE_CREATE(新增)、TYPE_UPDATE(修改)、TYPE_DELETE(删除)
     */
    public void autoInjectBaseData(Object object, SysUser opUser, String type) {
        AutoInjectUtils.autoInjectBaseData(object, opUser, type);
    }

    /**
     * 更新对象的yyyy\mm\dd的值
     *
     * @param object
     * @param yyyyMMdd
     */
    public void updateYyyyMmdd(Object object, Date yyyyMMdd) {
        AutoInjectUtils.updateYyyyMmdd(object, yyyyMMdd);
    }

    /**
     * 自动注入数据
     *
     * @param object   对象
     * @param opUser   登录用户
     * @param type     操作数据类型：TYPE_CREATE(新增)、TYPE_UPDATE(修改)、TYPE_DELETE(删除)
     * @param today    当前日期
     * @param yyyyMMdd 更新yyyy,mm,dd 等字段
     */
    public void autoInjectBaseData(Object object, SysUser opUser, String type, Date today, Date yyyyMMdd) {
        AutoInjectUtils.autoInjectBaseData(object, opUser, type, today, yyyyMMdd);
    }

    /**
     * 列表到树，所处理的对象比率包含sid、parent_sid、children三个属性
     *
     * @param arr
     * @param <T>
     * @return
     */
    public <T> List<T> convertList2Tree(List<T> arr) throws HlpException {
        if (arr == null || arr.isEmpty()) {
            return arr;
        }
        List<T> r = new ArrayList<>();
        try {
            Method getSid = arr.get(0).getClass().getMethod("getSid");
            Method getParent_sid = arr.get(0).getClass().getMethod("getParent_sid");
            Method getChildren = arr.get(0).getClass().getMethod("getChildren");
            Method setChildren = arr.get(0).getClass().getMethod("setChildren", List.class);
            Map<String, Object> hash = new HashMap<>();
            for (T x : arr) {
                String sid = (String) getSid.invoke(x);
                hash.put(sid, x);
            }
            // 遍历结果集
            for (T x : arr) {
                // 单条记录
                //在hash中取出key为单条记录中pid的值
                T hashVP = (T) hash.get(getParent_sid.invoke(x));
                //如果记录的pid存在，则说明它有父节点，将她添加到孩子节点的集合中
                if (hashVP != null) {
                    // 检查是否有child属性
                    Object childrenObj = getChildren.invoke(hashVP);
                    if (childrenObj != null) {
                        List<T> ch = (List<T>) childrenObj;
                        ch.add(x);
                        setChildren.invoke(hashVP, ch);
                    } else {
                        List<T> ch = new LinkedList<>();
                        ch.add(x);
                        setChildren.invoke(hashVP, ch);
                    }
                } else {
                    r.add(x);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new HlpException("转换出错" + e.getMessage());
        }
        return r;
    }

    public String getUserName(SysUser opUser) {
        return opUser == null ? null : opUser.getName();
    }

    public String getUserSid(SysUser opUser) {
        return opUser == null ? null : opUser.getSid();
    }
}
